package ar.unsam.tp.test

import ar.unsam.tp.observers.AmigoAnotadoObserver
import ar.unsam.tp.observers.PartidoConfirmadoObserver
import ar.unsam.tp.observers.PartidoIncompletoObserver
import ar.unsam.tp.programa.Jugador
import ar.unsam.tp.programa.Partido
import ar.unsam.tp.tipo.Estandar
import org.junit.Before
import org.junit.Test

import static org.mockito.Matchers.*
import static org.mockito.Mockito.*

class TestEnvioMensajes {
	var Partido partido
	
	var mockPartidoConfirmadoObserver = mock(typeof(PartidoConfirmadoObserver))
	var mockPartidoIncompletoObserver = mock(typeof(PartidoIncompletoObserver))
	var mockAmigoAnotadoObserver = mock(typeof(AmigoAnotadoObserver))

	var Jugador jugador0
	var Jugador jugador1
	var Jugador jugador2
	var Jugador jugador3
	var Jugador jugador4
	var Jugador jugador5
	var Jugador jugador6
	var Jugador jugador7
	var Jugador jugador8
	var Jugador jugador9

	@Before
	def void init() {
		partido = new Partido()

		jugador0 = new Jugador("jugador0")
		jugador1 = new Jugador("jugador1")
		jugador2 = new Jugador("jugador2")
		jugador3 = new Jugador("jugador3")
		jugador4 = new Jugador("jugador4")
		jugador5 = new Jugador("jugador5")
		jugador6 = new Jugador("jugador6")
		jugador7 = new Jugador("jugador7")
		jugador8 = new Jugador("jugador8")
		jugador9 = new Jugador("jugador9")

		jugador0.setTipoDeInscripcion(new Estandar())
		jugador1.setTipoDeInscripcion(new Estandar())
		jugador2.setTipoDeInscripcion(new Estandar())
		jugador3.setTipoDeInscripcion(new Estandar())
		jugador4.setTipoDeInscripcion(new Estandar())
		jugador5.setTipoDeInscripcion(new Estandar())
		jugador6.setTipoDeInscripcion(new Estandar())
		jugador7.setTipoDeInscripcion(new Estandar())
		jugador8.setTipoDeInscripcion(new Estandar())
		jugador9.setTipoDeInscripcion(new Estandar())
	}

	@Test
	def void testMensajePartidoConfirmado() {
		partido.agregarObservador(mockPartidoConfirmadoObserver)

		partido.alta(jugador0)
		partido.alta(jugador1)
		partido.alta(jugador2)
		partido.alta(jugador3)
		partido.alta(jugador4)
		partido.alta(jugador5)
		partido.alta(jugador6)
		partido.alta(jugador7)
		partido.alta(jugador8)
		partido.alta(jugador9)

		verify(mockPartidoConfirmadoObserver, atLeast(1)).notificarPartidoConfirmado(any)
	}

	@Test
	def void testMensajePartidoIncompleto() {
		partido.agregarObservador(mockPartidoIncompletoObserver)

		partido.alta(jugador0)
		partido.alta(jugador1)
		partido.alta(jugador2)
		partido.alta(jugador3)
		partido.alta(jugador4)
		partido.alta(jugador5)
		partido.alta(jugador6)
		partido.alta(jugador7)
		partido.alta(jugador8)
		partido.alta(jugador9)

		partido.baja(jugador9)
		partido.baja(jugador8)

		verify(mockPartidoIncompletoObserver, atLeast(1)).notificarPartidoIncompleto(any)
	}

	@Test
	def void testMensajeAmigoAnotado() {
		partido.agregarObservador(mockAmigoAnotadoObserver)

		partido.alta(jugador0)

		verify(mockAmigoAnotadoObserver, atLeast(1)).notificarJugadorInscripto(any, any)
		}
	}
	